/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package mailserver;

import LibreriaServer.LServer;
import MailCliente.MailCliente;
import Message.Mensaje;
import Persistencia.ArchivoDatos;
import Persistencia.EscribirArchivo;
import SwConfMessage.Interfaz.IGuardarRecuperar;
import SwConfMessage.Interfaz.IMailServer;
import SwConfMessage.Interfaz.IMensaje;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

/**
 * @author Adriana
 *
 * * @version 1.0.1 14 de Diciembre de 2013
 */
public class MailServer1 implements IMailServer {

    /**
     * Variable privada lista de MailServer
     */
    private ArrayList<Mensaje> listaMensajesServer;
    private ArrayList<String> listaClientes;
    private String NameMailServer;

    /**
     * Constructor de la Clase
     */
    public MailServer1(String name) throws Exception {

        ArchivoDatos<MailServer1> datos = new ArchivoDatos();

        if (datos.existe(LServer.patchServer(), name, LServer.Ser)) {
            try {
                this.NameMailServer =name;
                recuperar();

            } catch (Exception ex) {
                Logger.getLogger(MailServer1.class.getName()).log(Level.SEVERE, null, ex);
            }
            return;
        }


        listaMensajesServer = new ArrayList<Mensaje>();
        listaClientes = new ArrayList<String>();
        this.NameMailServer = name;
        guardar();

    }
    
    
    

    /**
     * Funcion que retorna la cantidad de mensajes para el usuario que lo
     * solicita
     *
     * @param name
     * @return numero de mensajes
     */
    @Override
    public int getMessagesWaitting(String name) {
        int numeroMsj = 0;
        int cantidadMensajesServer = listaMensajesServer.size();

        while (cantidadMensajesServer > 0) {
            cantidadMensajesServer--;

            Mensaje mensaje = listaMensajesServer.get(cantidadMensajesServer);
            String namesender = mensaje.NombreDestino();

            numeroMsj = numeroMsj + isUser(namesender, name);
        }
        return (numeroMsj);
    }

    /**
     * Funcion que retorna 1 si es el usuario que solicita el msj.
     *
     * @param namesender
     * @param name
     * @return un entero
     */
    public int isUser(String namesender, String name) {
        if (namesender.equals(name)) {
            return 1;
        }
        return 0;
    }

    /**
     * Funcion que retorna el siguiente mensaje para el usuario que lo solicita
     *
     * @param name
     * @return Mensaje Solicitado
     */
    @Override
    public IMensaje getNextMessage(String name) {
        int indice = 0;
        int cantidadMensajesServer = listaMensajesServer.size();

//        Mensaje mensaje = listaMensajesServer.get(indice);

        String namesender = "";//mensaje.NombreDestino();

        while (cantidadMensajesServer > indice && !namesender.equals(name)) {
            namesender = listaMensajesServer.get(indice).NombreDestino();
            indice++;
        }
        indice--;

        if (namesender.equals(name)){//indice < cantidadMensajesServer) {

            Mensaje mensajeMostrarse = listaMensajesServer.get(indice);
            listaMensajesServer.remove(indice);
            guardar();
            return (mensajeMostrarse);
        }
        return (null);

    }

    /**
     * Metodo que toma el mensaje que pasa por parametro y dirige el mismo al
     * usuario que se encuentra especificado en el mensaje.
     *
     * @param message
     */
    @Override
    public void post(IMensaje message) {

        listaMensajesServer.add((Mensaje) message);
        guardar();
    }

   
    /**
     * Function que retorna una lista de String, que son las mensajes que
     * contiene el servidor.
     *
     * @return Lista
     */
    @Override
    public String toString() {
    String s =  LServer.Imprimir(listaClientes);
           s = s + "\r\n";
           s = s + LServer.Imprimir(listaMensajesServer);
    
        return  s;
    }

//    public void crearDirectorio(String nameServer) {
//        File dir = new File("Servidor/" + nameServer);
//        dir.mkdir();
//
//    }
    @Override
    public String nameServer() {
        return NameMailServer;
    }

    @Override
    public MailServer1 getMailServer(String nameServer) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    

    public int anadirClientes(String nameuser) {

        if (!LServer.existeString(listaClientes,nameuser)) {
           
            listaClientes.add(nameuser);
            guardar();
            return 0;
        }
             
    
        return -1;
        
        

    }

    public void eliminarCliente(String name) {

        listaClientes.remove(name);

    }

 
    
    
    public static void main(String[] args) throws Exception {
        // TODO code application logic here
        MailServer1 s = new MailServer1("pureba");

    }

    @Override
    public void guardar() {
        try {
            String Pach = LServer.patchServer();
            ArchivoDatos<MailServer1> binarioServer = new ArchivoDatos<>();
            binarioServer.guardar(this,Pach, NameMailServer, LServer.Ser);
        } catch (Exception ex) {
            Logger.getLogger(MailServer1.class.getName()).log(Level.SEVERE, null, ex);
        }
        
    }

    @Override
    public void recuperar() {
        try {
            String Pach = LServer.patchServer();
            ArchivoDatos<MailServer1> binarioServer = new ArchivoDatos<>();
           MailServer1 servidor =  binarioServer.recuperar(Pach, NameMailServer, LServer.Ser);
           this.listaClientes = servidor.listaClientes;
           this.listaMensajesServer = servidor.listaMensajesServer;
        } catch (Exception ex) {
            Logger.getLogger(MailServer1.class.getName()).log(Level.SEVERE, null, ex);
        }
        
    }
    
    
    
      public ArrayList<String> getListaUsuarios (){
        return listaClientes;
    }
      
      
        public ArrayList<Mensaje> getListaMensajes (){
        return listaMensajesServer;
    }
         
}
